export type RouterOptions = {
	// 定义路由选项类型，包括路由路径、路由名称、路由参数等
	url ?: string; // 路由路径，例如 /home 或 /user/:id 等
	delta ?: number; // 返回的页面数，如果 delta 大于现有页面数，则返回到首页。可选参数，默认为 1。
	openType ?: string; // 跳转方式，例如 navigateTo、redirectTo、reLaunch、switchTab 等，可选参数，默认为 navigateTo。
	animationType ?: string; // 路由动画类型，例如 fade、slide 等，可选参数，默认为 pop-in
	animationDuration ?: string; // 窗口动画持续时间，单位为 ms ，可选参数，默认为 300ms
	params ?: object; // 路由参数，例如 { id: 1 } 等，可选参数，默认为空对象 {}。
	events ?: object; // 页面间通信接口，用于监听被打开页面发送到当前页面的数据，可选参数，默认为空对象 {}。
	success ?: Function; // 路由跳转成功，可选参数，默认为空函数。
	fail ?: Function; // 路由跳转成功或失败的回调函数，可选参数，用于执行一些操作或显示错误信息等，默认为空函数。
	complete ?: Function; // 路由跳转完成后的回调函数，可选参数，用于执行一些清理或收尾操作，默认为空函数。
};
const routerDefaultOptions : RouterOptions = {
	animationType: 'pop-in',
	animationDuration: '300',
	delta: 1
};

/**
 * 路由跳转 hooks
 * @return
 */
export default function useRouter() {
	const formatParame = (options : RouterOptions | string) => {
		let page : any = {};

		if (typeof options === 'string') {
			// 如果传入的参数是字符串，则直接使用该字符串作为路由路径进行跳转。
			page = { url: options }; // 创建一个包含路由路径的对象
		} else {
			let url =
				options.url
			if (options.params) {
				let paramsStr = Object.keys(options.params)
					.map((key) => `${key}=${options.params[key]}`)
					.join('&');
				url += '?' + paramsStr;
				// options.url += '?' +
				// 	Object.keys(options.params)
				// 		.map((key) => `${key}=${options.params[key]}`)
				// 		.join('&');
			}
			page = { ...routerDefaultOptions, ...options, url };
		}
		return page;
	};
	/**
	 * 保留当前页面，跳转到应用内的某个页面
	 * @param {RouterOptions | string} options 路由选项，包括路由路径、路由名称、路由参数等。
	 */
	const push = (options : RouterOptions | string) => {
		uni.navigateTo({
			...formatParame(options)
		});
	};
	/**
	 *  关闭当前页面，跳转到应用内的某个页面
	 * @param {RouterOptions | string} options 路由选项，包括路由路径、路由名称、路由参数等。
	 */
	const redirect = (options : RouterOptions | string) => {
		uni.redirectTo({
			...formatParame(options)
		});
	};
	/**
	 *  关闭所有页面，打开到应用内的某个页面。
	 * @param {RouterOptions | string} options 路由选项，包括路由路径、路由名称、路由参数等。
	 */
	const reLaunch = (options : RouterOptions | string) => {
		uni.reLaunch({
			...formatParame(options)
		});
	};
	/**
	 *  关闭所有页面，打开到应用内的某个页面。
	 * @param {RouterOptions | string} options 路由选项，包括路由路径、路由名称、路由参数等。
	 */
	const switchTab = (options : RouterOptions | string) => {
		uni.switchTab({
			...formatParame(options)
		});
	};

	/**
	 *  关闭所有页面，打开到应用内的某个页面。
	 * @param {RouterOptions | string} options 路由选项，包括路由路径、路由名称、路由参数等。
	 */
	const back = (options : RouterOptions | string) => {
		uni.navigateBack({
			...formatParame(options)
		});
	};

	return {
		push,
		redirect,
		reLaunch,
		switchTab,
		back
	};
}